# -*- coding: utf-8 -*-

import re
def replace_dynamic_cast(text):
    # 正则表达式模式说明：
    # (\w+)\s*\.\s*dynamicCast\s*<\s*(\w+)\s*>\s*\(\s*\)
    # 第1组 (\w+) ：匹配变量名（如 fileBase）
    # \s*\.\s*   ：匹配带空格的句点
    # dynamicCast ：固定关键字
    # \s*<\s*    ：匹配带空格的左尖括号
    # 第2组 (\w+) ：匹配模板类型（如 CloudFile）
    # \s*>\s*\(\s*\)：匹配带空格的右尖括号和空括号
    
    pattern = r'(\w+)\s*\.\s*dynamicCast\s*<\s*(\w+)\s*>\s*\(\s*\)'
    
    # 替换模式：使用捕获组重组成新形式
    replacement = r'std::dynamic_pointer_cast<\2>(\1)'
    
    return re.sub(pattern, replacement, text)
def replace_if_nonull(text):
    # 正则表达式匹配 !jsonDoc.isNull()
    pattern = r'!(\w+)\.isNull\(\)'
    
    # 替换为捕获组 \1
    replacement = r'\1'
    
    return re.sub(pattern, replacement, text)

def replace_if_null(text):
    # 正则表达式匹配 jsonDoc.isNull()
    pattern = r'(\w+)\.isNull\(\)'
    
    # 替换为 !jsonDoc
    replacement = r'!\1'
    
    return re.sub(pattern, replacement, text)

# 测试示例
if __name__ == "__main__":
    if False:
        test_cases = [
            "fileBase.dynamicCast<CloudFile>()",  # 标准形式
            "fileBase.dynamicCast<CloudFile>()",   # 无空格
            "fileBase . dynamicCast<CloudFile >()", # 点前后空格
            "fileBase.dynamicCast< CloudFile>()",  # 类型前空格
            "obj.dynamicCast<MyType>()",           # 不同变量名和类型
        ]
        
        for s in test_cases:
            result = replace_dynamic_cast(s)
            print(f"原始: {s}\n替换: {result}\n{'-'*40}")

    if False:
        test_cases = [
            "!jsonDoc.isNull()",
            "if (!data.isNull()) { doSomething(); }",
            "result = !myObj.isNull() ? myObj.value() : defaultValue;"
        ]

        for s in test_cases:
            result = replace_if_nonull(s)
            print(f"原始: {s}\n替换: {result}\n{'-'*40}")

    if True:
        test_cases = [
        "jsonDoc.isNull()",
        "if (jsonDoc.isNull()) { doSomething(); }",
        "result = data.isNull() ? myObj.value() : defaultValue;"
        ]
        
        for s in test_cases:
            result = replace_if_null(s)
            print(f"原始: {s}\n替换: {result}\n{'-'*40}")
